
/**
 * 防抖
 * 
 * 防抖是指在事件被触发n秒后再执行回调，如果在这n秒内又被触发，则重新计时。
 */

function throttle(fun, time) {

  let timer;

  return function () {
    // 在n秒内执行，清除定时器
    if (timer) {
      clearTimeout(timer);
      timer = null
    }

    timer = setTimeout(() => {
      // fun.call(this, ...arguments)
      fun.apply(this, arguments)

    }, time)
  }
}



/**
 * 节流
 * 
 * 节流是指规定在单位时间内，只能触发一次函数。如果这个单位时间内触发多次函数，只有一次能生效。
 */

function throttle(fun, n) {
  let timer;
  return function () {
    if (timer) {
      return
    }

    timer = setTimeout(() => {
      // fun.call(this, ...arguments);
      fun.apply(this, arguments);

      clearTimeout(timer);
      timer = null

    }, n)


  }
}

/**
 * Arguments 对象
 * arguments对象不是一个 Array 。它类似于Array，但除了 length 属性和索引元素之外没有任何Array属性。
 * https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments
 */

function func1(a, b, c) {
  console.log(arguments[0]);
  // Expected output: 1

  console.log(arguments[1]);
  // Expected output: 2

  console.log(arguments[2]);
  // Expected output: 3
}

func1(1, 2, 3);


/**
 * 剩余参数
 * @param  {...any} args 
 * @returns 
 */
function foo(...args) {
  return args;
}
foo(1, 2, 3); // [1,2,3]
